<?php

class UtilHelper extends AppHelper {

    function id_decode($id) {
        $alpha_array = array('Y', 'D', 'U', 'R', 'P', 'S', 'B', 'M', 'A', 'T', 'H');
        $idDecodificado = base64_decode($id);
        list($idDecodificado, $letter) = split("\+", $idDecodificado);

        for ($i = 0; $i < count($alpha_array); $i++) {
            if ($alpha_array[$i] == $letter)
                break;
        }

        for ($j = 1; $j <= 5; $j++) {
            $idDecodificado = base64_decode($idDecodificado);
        }
        $idDecodificado = preg_replace('/=/', '', $idDecodificado);
        return $idDecodificado;
    }

    function id($id) {
        $idCodificado = $id;
        $num = mt_rand(0, 10);

        for ($i = 1; $i <= 5; $i++) {
            $idCodificado = base64_encode($idCodificado);
        }

        $alpha_array = array('Y', 'D', 'U', 'R', 'P', 'S', 'B', 'M', 'A', 'T', 'H');
        $idCodificado = $idCodificado . "+" . $alpha_array[$num];
        $idCodificado = preg_replace('/=/', '', base64_encode($idCodificado));
        return $idCodificado;
    }

    function clave($t) {
        return md5(addslashes(trim($t)));
    }

    function formatocedula($cedula, $guion = true) {
        if ($guion) {
            return substr($cedula, 0, 1) . "-" . str_pad(substr($cedula, 1), 8, '0', 0);
        } else {
            return substr($cedula, 0, 1) . str_pad(substr($cedula, 2), 9, '0', 0);
        }
    }

    function miles($numero, $cant = 2, $sepM = '.', $sepD = ',') {
        if(empty($sepM))
            $sepM = '.';
        if(empty($sepD))
            $sepD = ',';
        return number_format($numero, $cant, $sepD, $sepM);
    }

    function mil_postgres($numero) {
        return str_replace(',', '.', str_replace('.', '', $numero));
    }

    /**
     * Cambia un formato sql a una fecha normal o la divide en un arreglo
     *
     * @param string $fecha cadena de fecha con formato sql (yyyy-mm-dd hh:mm:ss)
     * @param boolean $inarray indica si retornar el resultado en un arreglo o no
     * @param string $lang formato de la fecha segun el lenguaje
     * @param string $sep caracter separador de numeros con el que se imprime la fecha
     * @return mixed retorna la fecha o un arreglo segun el valor del segundo parametro de la funcion
     */
    function fecha($fecha, $inarray = false, $lang = "es", $sep = "-") {
        $fechanor = "";
        preg_match("/([0-9]{2,4})-([0-9]{1,2})-([0-9]{1,2})/", $fecha, $frev);
        if ($frev) {
            if ($inarray) {
                return $frev;
            }
            if ($lang == "en") {
                $fechanor = date("m{$sep}d{$sep}Y", mktime(0, 0, 0, $frev[2], $frev[3], $frev[1]));
            } else {
                $fechanor = date("d{$sep}m{$sep}Y", mktime(0, 0, 0, $frev[2], $frev[3], $frev[1]));
            }
        }
        return $fechanor;
    }

    /**
     * Cambia un formato sql a una fecha normal o la divide en un arreglo y le aplica la operacion matematica deseada
     * 
     * @param string $fecha cadena de fecha con formato sql (yyyy-mm-dd hh:mm:ss)
     * @param boolean $inarray indica si retornar el resultado en un arreglo o no
     * @param string $lang formato de la fecha segun el lenguaje
     * @param string $sep caracter separador de numeros con el que se imprime la fecha
     * @param type $tiempo arreglo para aplicar operaciones matematicas
     * @return mixed retorna la fecha o un arreglo segun el valor del segundo parametro de la funcion
     */
    function fecha_operacion($fecha, $inarray = false, $lang = "es", $sep = "/", $tiempo = array('+', 0, 0, 0)) {
        $fechanor = "";
        preg_match("/([0-9]{2,4})-([0-9]{1,2})-([0-9]{1,2})/", $fecha, $frev);
        if ($frev) {
            $frev[2] = "($frev[2]$tiempo[0]$tiempo[1])";
            $frev[2] = eval("return $frev[2];");
            $frev[3] = "($frev[3]$tiempo[0]$tiempo[2])";
            $frev[3] = eval("return $frev[3];");
            $frev[1] = "($frev[1]$tiempo[0]$tiempo[3])";
            $frev[1] = eval("return $frev[1];");
            if ($inarray) {
                return $frev;
            }
            if ($lang == "en") {
                $fechanor = date("m{$sep}d{$sep}Y", mktime(0, 0, 0, $frev[2], $frev[3], $frev[1]));
            } else {
                $fechanor = date("d{$sep}m{$sep}Y", mktime(0, 0, 0, $frev[2], $frev[3], $frev[1]));
            }
        }
        return $fechanor;
    }

    /**
     * Cambia el formato sql de una fecha con hora a formato humano o la divide en un arreglo
     *
     * @param string $fecha cadena de fecha con formato sql (yyyy-mm-dd hh:mm:ss)
     * @param boolean $inarray indica si retornar el resultado en un arreglo o no
     * @param string $lang formato de la fecha segun el lenguaje
     * @param string $sep caracter separador de numeros con el que se imprime la fecha
     * @param integer $format formato de la hora a mostrar, 12 o 24 horas
     * @return mixed retorna la fecha o un arreglo segun el valor del segundo parametro de la funcion
     */
    function fecha_hora($fecha, $inarray = false, $lang = "es", $sep = "-", $format = 12) {
        $fechanor = "";
        $fh = "H";
        $ap = "";
        preg_match("/([0-9]{2,4})-([0-9]{1,2})-([0-9]{1,2}) ([0-9]{1,2}):([0-9]{1,2})/", $fecha, $frev);
        if ($frev) {
            if ($inarray) {
                return $frev;
            }
            if ($format != 24) {
                $fh = "h";
                $ap = " A";
            }
            if ($lang == "en") {
                $fechanor = date("m{$sep}d{$sep}Y {$fh}:i{$ap}", mktime($frev[4], $frev[5], 0, $frev[2], $frev[3], $frev[1]));
            } else {
                $fechanor = date("d{$sep}m{$sep}Y {$fh}:i{$ap}", mktime($frev[4], $frev[5], 0, $frev[2], $frev[3], $frev[1]));
            }
            $fechanor = trim($fechanor);
        }
        return $fechanor;
    }

    /**
     * Cambia el formato de una hora
     *
     * @param string $hora cadena de la hora (hh:mm:ss)
     * @param boolean $inarray indica si retornar el resultado en un arreglo o no
     * @param integer $format formato de la hora a mostrar, 12 o 24 horas
     * @return mixed retorna la hora o un arreglo segun el valor del segundo parametro de la funcion
     */
    function hora($hora, $inarray = false, $format = 12) {
        $horanor = "";
        preg_match("/([0-9]{1,2}):([0-9]{1,2})/", $hora, $hrev);
        if ($hrev) {
            if ($inarray) {
                return $hrev;
            }
            if ($format != 24) {
                $horanor = date("h:i a", mktime($hrev[1], $hrev[2]));
            } else {
                $horanor = date("H:i", mktime($hrev[1], $hrev[2]));
            }
        }
        return $horanor;
    }

    /**
     * Da el formato de una fecha a el formato sql (yyyy-mm-dd)
     *
     * @param string $fecha cadena con la fecha a dar formato
     * @param string $lang formato de lenguaje de la fecha de origien (dd-mm-yyyy o mm-dd-yyyy)
     * @return string
     */
    function fecha_sql($fecha, $lang = "es") {
        $fechasql = "";
        preg_match("/([0-9]{1,2})[-\/]([0-9]{1,2})[-\/]([0-9]{2,4})/", $fecha, $frev);
        if ($frev) {
            if ($lang == "en") {
                $fechasql = date("Y-m-d", mktime(0, 0, 0, $frev[1], $frev[2], $frev[3]));
            } else {
                $fechasql = date("Y-m-d", mktime(0, 0, 0, $frev[2], $frev[1], $frev[3]));
            }
        }
        return $fechasql;
    }

    /**
     * Da el formato de una fecha hora a el formato sql (yyyy-mm-dd hh:mm:ss)
     *
     * @param string $fecha cadena con la fecha y hora a dar formato (dd-mm-yyyy hh:mm:ss [am/pm])
     * @param string $lang formato de lenguaje de la fecha de origien (dd-mm-yyyy o mm-dd-yyyy)
     * @return string
     */
    function fecha_hora_sql($fecha, $lang = "es") {
        $fsql = "";
        $hsql = "";
        $farray = explode(" ", trim($fecha));

        preg_match("/([0-9]{1,2})[-\/]([0-9]{1,2})[-\/]([0-9]{2,4})/", $farray[0], $frev);
        if ($frev) {
            if ($lang == "en") {
                $fsql = date("Y-m-d", mktime(0, 0, 0, $frev[1], $frev[2], $frev[3]));
            } else {
                $fsql = date("Y-m-d", mktime(0, 0, 0, $frev[2], $frev[1], $frev[3]));
            }
        }

        preg_match("/([0-9]{1,2}):([0-9]{1,2})/", $farray[1], $frev);
        if ($frev) {
            if ($farray[2]) {
                $chars = array(" ", ".");
                $farray[2] = strtolower(str_replace($chars, "", $farray[2]));
                if (($farray[2] == "pm") && ($frev[1] <= 12)) {
                    $frev[1]+=12;
                }
            }
            $hsql = date("H:i:s", mktime($frev[1], $frev[2], 0));
        }

        $fechasql = trim($fsql . " " . $hsql);
        return $fechasql;
    }

}
